package com.cskaoyan.javase.oop2.polymorphic10.basic2.method2;

/**
 * @description: 主菜：方法的多态
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 对于多态的访问方式而言，父类引用指向了子类对象
 * 编译时看左边，只能调用父类有的方法
 * 但是方法是有多态性的
 * 运行时看右边
 *
 *

 > 解释方法的多态性，一个很贴切的例子
 - 我家中的一台电视机，贼贵，功能很丰富
 - 对于电视机而言，我们只能使用，遥控器去操作电视机
 - 这也就是说，只有遥控器上提供的功能我们才能使用
 - 即便电视机本身功能多么强大，如果遥控器上只有音量键，那我们也毫无办法
 - 遥控器有啥功能，决定了我们能使用的功能
 - 即使电视机本身功能再丰富，没有遥控器的支持，我们啥也用不了

 > 把这个例子转换到Java程序中

 - 电视机就相当于对象本身，而遥控器就是引用变量
 - 实际对象的功能再强大，如果引用中没有这个功能，那也无法调用该功能 父类的引用 里面是没有子类的方法的
 - 对象的行为，受限于引用变量，和对象本身没有直接关系
 - 对象的引用类型决定了可以访问对象的成员范围
 - 编译时看左边，运行时看右边
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        //多态访问方式
        Father f;
        f = new Son();
        f.test();//Son
        //f.testSon();
        f = new Son2();
        f.test();//Son2
    }
}

class Father {
    public void test() {
        System.out.println("Father");
    }
}

class Son extends Father {
    @Override
    public void test() {
        System.out.println("Son");
    }
    public void testSon(){

    }
}

class Son2 extends Father {
    @Override
    public void test() {
        System.out.println("Son2");
    }
}
